Arkitektur för progressiva webbappar: Mönster för JavaScript Service Worker | MLOG | MLOG

4. Network-Only (Endast nÀtverk)

Network-only-strategin hÀmtar alltid tillgÄngar frÄn nÀtverket och kringgÄr cachen helt. Denna strategi anvÀnds nÀr du absolut behöver den senaste versionen av en resurs och cachning inte Àr önskvÀrd.

Exempel:

            
self.addEventListener('fetch', event => {
  event.respondWith(
    fetch(event.request)
  );
});

            

5. Stale-While-Revalidate

Stale-while-revalidate-strategin serverar den cachade tillgÄngen omedelbart samtidigt som den hÀmtar den senaste versionen frÄn nÀtverket. NÀr nÀtverksförfrÄgan Àr klar uppdateras cachen med den nya versionen. Denna strategi ger ett snabbt initialt svar samtidigt som den sÀkerstÀller att anvÀndaren sÄ smÄningom fÄr det mest uppdaterade innehÄllet. Detta Àr en anvÀndbar strategi för icke-kritiskt innehÄll dÀr hastighet Àr viktigare Àn absolut fÀrskhet.

Exempel:

            
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request)
      .then(response => {
        const fetchPromise = fetch(event.request).then(networkResponse => {
          caches.open('my-cache').then(cache => {
            cache.put(event.request, networkResponse.clone());
            return networkResponse;
          });
        });
        return response || fetchPromise;
      })
  );
});

            

6. Cache, then Network (Cache, sedan nÀtverk)

Liknar stale-while-revalidate men utan att omedelbart returnera den cachade tillgÄngen. Den kontrollerar cachen först, och endast om tillgÄngen finns dÀr fortsÀtter nÀtverksförfrÄgan i bakgrunden för att uppdatera cachen.

VÀlja rÀtt cachningsstrategi

Den optimala cachningsstrategin beror pÄ de specifika kraven i din applikation. TÀnk pÄ faktorer som:

Genom att noggrant vÀlja lÀmpliga cachningsstrategier kan du avsevÀrt förbÀttra prestandan och anvÀndarupplevelsen för din PWA, Àven i offline-miljöer. Verktyg som Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)) kan förenkla implementeringen av dessa strategier.

Bakgrundssynkronisering: Hantera offline-mutationer

Bakgrundssynkronisering gör att din PWA kan utföra uppgifter i bakgrunden, Àven nÀr anvÀndaren Àr offline. Detta Àr sÀrskilt anvÀndbart för att hantera formulÀrinskickningar, datauppdateringar och andra operationer som krÀver nÀtverksanslutning. `BackgroundSyncManager` API:et gör det möjligt att registrera uppgifter som kommer att utföras nÀr nÀtverket blir tillgÀngligt.

Registrera en bakgrundssynkroniseringsuppgift

För att registrera en bakgrundssynkroniseringsuppgift mÄste du anvÀnda `register`-metoden i `BackgroundSyncManager`. Denna metod tar ett unikt taggnamn som argument. Taggnamnet identifierar den specifika uppgiften som ska utföras.

Exempel:

            
self.addEventListener('sync', event => {
  if (event.tag === 'my-sync-task') {
    event.waitUntil(doSomeWork());
  }
});

            

Hantera sync-hÀndelsen

NÀr webblÀsaren upptÀcker nÀtverksanslutning skickar den en `sync`-hÀndelse till Service Workern. Du kan lyssna pÄ denna hÀndelse och utföra nödvÀndiga ÄtgÀrder, som att skicka data till servern.

Exempel:

            
async function doSomeWork() {
  // Retrieve data from IndexedDB
  const data = await getDataFromIndexedDB();

  // Send data to the server
  try {
    const response = await fetch('/api/sync', {
      method: 'POST',
      body: JSON.stringify(data),
      headers: {
        'Content-Type': 'application/json'
      }
    });

    if (response.ok) {
      // Clear the data from IndexedDB
      await clearDataFromIndexedDB();
    } else {
      // Handle errors
      console.error('Sync failed:', response.status);
      throw new Error('Sync failed');
    }
  } catch (error) {
    // Handle network errors
    console.error('Network error:', error);
    throw error;
  }
}

            

Exempel: Offline-formulÀrinskickning

FörestÀll dig ett scenario dÀr en anvÀndare fyller i ett formulÀr nÀr hen Àr offline. Service Workern kan lagra formulÀrdatan i IndexedDB och registrera en bakgrundssynkroniseringsuppgift. NÀr nÀtverket blir tillgÀngligt kommer Service Workern att hÀmta formulÀrdatan frÄn IndexedDB och skicka den till servern.

  1. AnvÀndaren fyller i formulÀret och klickar pÄ skicka medan hen Àr offline.
  2. FormulÀrdatan lagras i IndexedDB.
  3. En bakgrundssynkroniseringsuppgift registreras med en unik tagg (t.ex. `form-submission`).
  4. NÀr nÀtverket Àr tillgÀngligt utlöses `sync`-hÀndelsen.
  5. Service Workern hÀmtar formulÀrdatan frÄn IndexedDB och skickar den till servern.
  6. Om inskickningen lyckas tas formulÀrdatan bort frÄn IndexedDB.

Push-notiser: Engagera anvÀndare med relevanta uppdateringar

Push-notiser gör det möjligt för din PWA att skicka relevanta uppdateringar och meddelanden till anvÀndare, Àven nÀr appen inte körs aktivt i webblÀsaren. Detta kan avsevÀrt förbÀttra anvÀndarengagemang och retention. Push API och Notifications API arbetar tillsammans för att leverera push-notiser.

Prenumerera pÄ push-notiser

För att ta emot push-notiser mÄste anvÀndare först ge din PWA tillstÄnd. Du kan anvÀnda `PushManager` API:et för att prenumerera anvÀndare pÄ push-notiser.

Exempel:

            
navigator.serviceWorker.ready.then(registration => {
  registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: 'YOUR_PUBLIC_VAPID_KEY'
  })
  .then(subscription => {
    // Send subscription details to your server
    sendSubscriptionToServer(subscription);
  })
  .catch(error => {
    console.error('Failed to subscribe:', error);
  });
});

            

Viktigt: ErsÀtt `YOUR_PUBLIC_VAPID_KEY` med din faktiska VAPID-nyckel (Voluntary Application Server Identification). VAPID-nycklar anvÀnds för att identifiera din applikationsserver och sÀkerstÀlla att push-notiser skickas sÀkert.

Hantera push-notiser

NÀr en push-notis tas emot skickar Service Workern en `push`-hÀndelse. Du kan lyssna pÄ denna hÀndelse och visa notisen för anvÀndaren.

Exempel:

            
self.addEventListener('push', event => {
  const payload = event.data ? event.data.text() : 'No payload';

  event.waitUntil(
    self.registration.showNotification('My PWA', {
      body: payload,
      icon: 'icon.png'
    })
  );
});

            

Anpassa push-notiser

Notifications API lÄter dig anpassa utseendet och beteendet för push-notiser. Du kan specificera titel, brödtext, ikon, mÀrke och andra alternativ.

Exempel:

            
self.addEventListener('push', event => {
  const data = event.data.json();
  const title = data.title || 'My PWA';
  const options = {
    body: data.body || 'No message',
    icon: data.icon || 'icon.png',
    badge: data.badge || 'badge.png',
    vibrate: [200, 100, 200],
    data: { // Custom data that you can access when the user clicks the notification
      url: data.url || '/'
    },
    actions: [
      {action: 'explore', title: 'Explore this new world',
        icon: 'images/checkmark.png'},
      {action: 'close', title: 'Close',
        icon: 'images/xmark.png'},
    ]
  };

  event.waitUntil(self.registration.showNotification(title, options));
});


self.addEventListener('notificationclick', function(event) {
  event.notification.close();

  // Check if the user clicked on an action.
  if (event.action === 'explore') {
    clients.openWindow(event.notification.data.url);
  } else {
    // Default action: open the app.
    clients.openWindow('/');
  }
});

            

Exempel: Nyhetsavisering

En nyhetsapplikation kan anvÀnda push-notiser för att varna anvÀndare om nya, viktiga nyheter. NÀr en ny artikel publiceras skickar servern en push-notis till anvÀndarens enhet, som visar en kort sammanfattning av artikeln. AnvÀndaren kan sedan klicka pÄ notisen för att öppna hela artikeln i PWA:n.

Avancerade mönster för Service Worker

1. Offline-analys

SpÄra anvÀndarbeteende Àven nÀr de Àr offline genom att lagra analysdata lokalt och skicka den till servern nÀr nÀtverket Àr tillgÀngligt. Detta kan uppnÄs med hjÀlp av IndexedDB och Background Sync.

2. Versionering och uppdatering

Implementera en robust versioneringsstrategi för din Service Worker för att sÀkerstÀlla att anvÀndare alltid fÄr de senaste uppdateringarna utan att störa deras upplevelse. AnvÀnd cache-busting-tekniker för att ogiltigförklara gamla cachade tillgÄngar.

3. ModulÀra Service Workers

Organisera din Service Worker-kod i moduler för att förbÀttra underhÄllbarhet och lÀsbarhet. AnvÀnd JavaScript-moduler (ESM) eller en modul-paketerare som Webpack eller Rollup.

4. Dynamisk cachning

Cacha tillgÄngar dynamiskt baserat pÄ anvÀndarinteraktioner och anvÀndningsmönster. Detta kan hjÀlpa till att optimera cachestorleken och förbÀttra prestandan.

BÀsta praxis för utveckling med Service Worker

Slutsats

JavaScript Service Workers Àr kraftfulla verktyg för att bygga robusta, högpresterande och engagerande PWA:er. Genom att förstÄ en Service Workers livscykel och implementera lÀmpliga cachningsstrategier, bakgrundssynkronisering och push-notiser kan du skapa exceptionella anvÀndarupplevelser, Àven i offline-miljöer. Denna artikel har utforskat centrala mönster och bÀsta praxis för Service Workers för att vÀgleda dig i att bygga framgÄngsrika PWA:er för en global publik. I takt med att webben fortsÀtter att utvecklas kommer Service Workers att spela en allt viktigare roll i att forma framtiden för webbutveckling.

Kom ihÄg att anpassa dessa mönster till dina specifika applikationskrav och att alltid prioritera anvÀndarupplevelsen. Genom att omfamna kraften i Service Workers kan du skapa PWA:er som inte bara Àr funktionella utan ocksÄ en fröjd att anvÀnda, oavsett anvÀndarens plats eller nÀtverksanslutning.

Ytterligare resurser: